<?php

App::import('Sanitize');

class ElementosSenializacionesController extends AppController {

    var $name = 'ElementosSenializaciones';
    var $paginate = array(
        'recursive' => 0,
        'order' => array('ElementosSenializacione.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        parent::beforeFilter();
        //$this->Auth->allow();
    }

    function add_elementos_senializacion() {
        $this->__aux_add_elementos_senializacion();
    }

    function admin_add_elementos_senializacion() {
        $this->__aux_add_elementos_senializacion();
    }

    /**
     * Permite dar de alta un nuevo elemento de señalización de una obra de arte
     */
    function __aux_add_elementos_senializacion() {
        $this->layout = false;

        if ($this->Session->check('id_obra')) {
            $obra_id = $this->Session->read('id_obra');

            $obra = $this->Obra->findById($obra_id);
            $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;

            $tipos = array('Horizontal' => 'Horizontal', 'Vertical' => 'Vertical');

            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));

            if (!empty($this->data)) {
                $this->ElementosSenializacione->begin();
                $this->data['ElementosSenializacione']['fecha_actualizacion'] = date("Y-m-d H:i:s");
                if (!empty($obra_id)) {
                    $this->data['ElementosSenializacione']['obra_id'] = $obra_id;
                    $this->__save_elementos_senializacion($obra_id, $this->data);
                } else {
                    $this->ElementosSenializacione->rollback();
                    echo 'El elemento de señalización no se ha podido guardar porque perdió la sesión.';
                    exit;
                }
            }
            $referer = $this->referer();
            $this->set(compact('tipos', 'estados', 'referer'));
            $this->render('add_elementos_senializacion');
        } else {
            $mensaje = 'Para poder dar de alta elementos de señalización, primero debe dar de alta una obra de arte en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function mostrar_elementos_senializacion($tipo_senializacion = null, $obra_id = null) {
        $this->__aux_mostrar_elementos_senializacion($tipo_senializacion, $obra_id);
    }

    function admin_mostrar_elementos_senializacion($tipo_senializacion = null, $obra_id = null) {
        $this->__aux_mostrar_elementos_senializacion($tipo_senializacion, $obra_id);
    }

    /**
     * 
     */
    function __aux_mostrar_elementos_senializacion($tipo_senializacion = null, $obra_id = null) {
        $this->layout = false;

        if ($this->Session->check('id_obra')) {
            $obra_id = $this->Session->read('id_obra');
        }
        $obra = $this->Obra->findById($obra_id);
        $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;

        $elementos_senializacion = array();
        if (!empty($obra_id) && !empty($tipo_senializacion)) {
            $elementos_senializacion = $this->ElementosSenializacione->MenuesSenializacione->find('list', array(
                        'fields' => array('MenuesSenializacione.id', 'MenuesSenializacione.nombre'), 'order' => 'MenuesSenializacione.nombre',
                        'conditions' => array('MenuesSenializacione.obras_tipo_id' => $obras_tipo_id,
                            'MenuesSenializacione.tipo' => $tipo_senializacion)
                            )
            );
        }

        $this->set(compact('elementos_senializacion'));
        $this->render('mostrar_elementos_senializacion');
    }

    function view_elementos_senializacion() {
        $this->__aux_view_elementos_senializacion();
    }

    function admin_view_elementos_senializacion() {
        $this->__aux_view_elementos_senializacion();
    }

    /**
     * Lista todos los elementos de señalización de la obra que se está dando de alta
     */
    function __aux_view_elementos_senializacion() {
        $this->layout = false;
        $obra_id = ($this->Session->check('id_obra')) ? $this->Session->read('id_obra') : 0;
        $obra = $this->ElementosSenializacione->Obra->findById($obra_id);
        $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

        $this->set('obra_nombre', $obra_nombre);
        $this->set('elementosSenializaciones', $this->paginate('ElementosSenializacione', array('ElementosSenializacione.obra_id' => $obra_id)));
        $this->render('view_elementos_senializacion');
    }

    function delete_elemento_senializacion($id = null) {
        $this->__aux_delete_elemento_senializacion($id);
    }

    function admin_delete_elemento_senializacion($id = null) {
        $this->__aux_delete_elemento_senializacion($id);
    }

    /**
     * Elimina un elemento de señalización
     */
    function __aux_delete_elemento_senializacion($id = null) {
        $this->layout = false;
        if (!empty($id)) {
            $datos_elemento_senializacion = $this->ElementosSenializacione->findById($id, array('recursive' => 0));

            if (!empty($datos_elemento_senializacion)) {

                // Chequeo si hay evaluaciones realizadas a dicho elemento
                $evaluacion = $this->ElementosSenializacionesEval->find('all', array('conditions' => array('ElementosSenializacionesEval.elementos_senializacione_id' => $id)));
                if (empty($evaluacion)) {

                    // Chequeo si hay intervenciones realizadas a dicho elemento
                    $intervencion = $this->ElementosSenializacionesInter->find('all', array('conditions' => array('ElementosSenializacionesInter.elementos_senializacione_id' => $id)));
                    if (empty($intervencion)) {

                        if ($this->ElementosSenializacione->delete($id)) {
                            echo 'El elemento de señalización se eliminó correctamente.';
                            exit;
                        } else {
                            echo 'Error: El elemento de señalización no se pudo eliminar.';
                            exit;
                        }
                    } else {
                        echo 'Error: El elemento de señalización no se puede eliminar porque existen intervenciones realizadas a dicho elemento.';
                        exit;
                    }
                } else {
                    echo 'Error: El elemento de señalización no se puede eliminar porque existen evaluaciones realizadas a dicho elemento.';
                    exit;
                }
            } else {
                echo 'Error: No se encontró el elemento de señalización en la db.';
                exit;
            }
        }
    }

    function evaluacion_elementos_senializacion() {
        $this->__aux_evaluacion_elementos_senializacion();
    }

    function admin_evaluacion_elementos_senializacion() {
        $this->__aux_evaluacion_elementos_senializacion();
    }

    /**
     * Permite registrar la evaluación de un elemento de senialización de una obra de arte
     */
    function __aux_evaluacion_elementos_senializacion() {
        $this->layout = false;

        if ($this->Session->check('id_evaluacione')) {
            $evaluacione_id = $this->Session->read('id_evaluacione');
            $evaluacion = $this->Evaluacione->findById($evaluacione_id);

            $obras_tipo_id = 0;
            $obra_id = 0;
            if (!empty($evaluacion)) {
                $obra_id = $evaluacion['Evaluacione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;
            }

            $tipos = array('Horizontal' => 'Horizontal', 'Vertical' => 'Vertical');
            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre'), 'order' => 'Estado.nombre'));

            if (!empty($this->data)) {
                $this->__save_evaluacion_elementos_senializacion($this->data);
            }

            $referer = $this->referer();
            $this->set(compact('tipos', 'estados', 'obra_id', 'evaluacione_id', 'referer'));
            $this->render('evaluacion_elementos_senializacion');
        } else {
            $mensaje = 'Para poder registrar la evaluación de un elemento de señalización, primero debe dar de alta una evaluación en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function listado_elementos_senializacion_evals() {
        $this->__aux_listado_elementos_senializacion_evals();
    }

    function admin_listado_elementos_senializacion_evals() {
        $this->__aux_listado_elementos_senializacion_evals();
    }

    /**
     * Lista todos los elementos de señalización de la obra para la cual se está registrando
     * la evaluación
     */
    function __aux_listado_elementos_senializacion_evals() {
        $this->layout = false;

        $id_evaluacione = ($this->Session->check('id_evaluacione')) ? $this->Session->read('id_evaluacione') : 0;
        $evaluacion = $this->Evaluacione->findById($id_evaluacione);

        $obra_nombre = '';
        $obra_id = 0;
        if (!empty($evaluacion)) {
            $obra_id = $evaluacion['Evaluacione']['obra_id'];
            $obra = $this->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
        }
        $this->set('obra_nombre', $obra_nombre);
        $this->set('elementosSenializacionesEvals', $this->paginate('ElementosSenializacione', array('ElementosSenializacione.obra_id' => $obra_id)));
        $this->render('listado_elementos_senializacion_evaluacion');
    }

    function read_elemento_senializacion($id = null) {
        $this->__aux_read_elemento_senializacion($id);
    }

    function admin_read_elemento_senializacion($id = null) {
        $this->__aux_read_elemento_senializacion($id);
    }

    /**
     * Recupera un elemento de señalización de la db y devuelve su información
     * como un string separado por "|":
     * id|obra_id|tipo|menues_senializacione_id|descripcion|estado_id
     */
    function __aux_read_elemento_senializacion($id = null) {
        $elemento_senializacion = '';
        if (!empty($id)) {
            $elemento = $this->ElementosSenializacione->findById($id, array('recursive' => 0));

            if (!empty($elemento)) {
                $menu_senializacion = $this->ElementosSenializacione->MenuesSenializacione->findById($elemento['ElementosSenializacione']['menues_senializacione_id'], array('recursive' => 0));
                $tipo = (!empty($menu_senializacion)) ? $menu_senializacion['MenuesSenializacione']['tipo'] : '';
                $elemento_senializacion = $elemento['ElementosSenializacione']['id'] . '|' .
                        $elemento['ElementosSenializacione']['obra_id'] . '|' .
                        $tipo . '|' .
                        $elemento['ElementosSenializacione']['menues_senializacione_id'] . '|' .
                        $elemento['ElementosSenializacione']['descripcion'] . '|' .
                        $elemento['ElementosSenializacione']['estado_id'];
            }
        }
        echo $elemento_senializacion;
        exit;
    }

    /////////////////

    function intervencion_elementos_senializacion() {
        $this->__aux_intervencion_elementos_senializacion();
    }

    function admin_intervencion_elementos_senializacion() {
        $this->__aux_intervencion_elementos_senializacion();
    }

    /**
     * Permite registrar la intervención de un elemento de senialización de una obra de arte
     */
    function __aux_intervencion_elementos_senializacion() {
        $this->layout = false;


        if ($this->Session->check('id_intervencione')) {
            $intervencione_id = $this->Session->read('id_intervencione');
            $intervencion = $this->Intervencione->findById($intervencione_id);

            $obras_tipo_id = 0;
            $obra_id = 0;
            if (!empty($intervencion)) {
                $obra_id = $intervencion['Intervencione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;
            }

            $tipos = array('Horizontal' => 'Horizontal', 'Vertical' => 'Vertical');
            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre')));

            if (!empty($this->data)) {
                $this->__save_intervencion_elementos_senializacion($this->data);
            }

            $referer = $this->referer();
            $this->set(compact('tipos', 'estados', 'obra_id', 'elementos_senializacion', 'intervencione_id', 'referer'));
            $this->render('intervencion_elementos_senializacion');
        } else {
            $mensaje = 'Para poder registrar la intervención de un elemento de señalización, primero debe dar de alta una intervención en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }


    function listado_elementos_senializacion_inters() {
        $this->__aux_listado_elementos_senializacion_inters();
    }

    function admin_listado_elementos_senializacion_inters() {
        $this->__aux_listado_elementos_senializacion_inters();
    }

    /**
     * Lista todos los elementos de señalización de la obra para la cual se está registrando
     * la intervención
     */
    function __aux_listado_elementos_senializacion_inters() {
        $this->layout = false;

        $id_intervencione = ($this->Session->check('id_intervencione')) ? $this->Session->read('id_intervencione') : 0;
        $intervencion = $this->Intervencione->findById($id_intervencione);

        $obra_nombre = '';
        $obra_id = 0;
        if (!empty($intervencion)) {
            $obra_id = $intervencion['Intervencione']['obra_id'];
            $obra = $this->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
        }
        $this->set('obra_nombre', $obra_nombre);
        $this->set('elementosSenializacionesInters', $this->paginate('ElementosSenializacione', array('ElementosSenializacione.obra_id' => $obra_id)));
        $this->render('listado_elementos_senializacion_intervencion');
    }

    function edit_elementos_senializacion($obra_id = null) {
        $this->__aux_edit_elementos_senializacion($obra_id);
    }

    function admin_edit_elementos_senializacion($obra_id = null) {
        $this->__aux_edit_elementos_senializacion($obra_id);
    }

    /**
     * Permite editar un elemento de la señalización de una obra de arte
     */
    function __aux_edit_elementos_senializacion($obra_id = null) {
        $this->layout = false;
        $tipos = array();
        $estados = array();

        if (!empty($obra_id)) {
            $obra = $this->Obra->findById($obra_id);
            $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;

            $tipos = array('Horizontal' => 'Horizontal', 'Vertical' => 'Vertical');

            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre')));
        } elseif (!empty($this->data)) {
            $this->ElementosSenializacione->begin();
            $obra_id = (isset($this->data['ElementosSenializacione']['obra_id']) && (!empty($this->data['ElementosSenializacione']['obra_id']))) ? $this->data['ElementosSenializacione']['obra_id'] : 0;
            $this->data['ElementosSenializacione']['fecha_actualizacion'] = date("Y-m-d H:i:s");
            $this->__save_elementos_senializacion($obra_id, $this->data);
        }
        $referer = $this->referer();
        $this->set(compact('obra_id', 'tipos', 'estados', 'referer'));
        $this->render('edit_elementos_senializacion');
    }

    function view_edit_elementos_senializacion($obra_id = null) {
        $this->__aux_view_edit_elementos_senializacion($obra_id);
    }

    function admin_view_edit_elementos_senializacion($obra_id = null) {
        $this->__aux_view_edit_elementos_senializacion($obra_id);
    }

    /**
     * Lista todos los elementos de señalización de la obra que se está editando
     */
    function __aux_view_edit_elementos_senializacion($obra_id = null) {
        $this->layout = false;
        if (!empty($obra_id)) {
            $obra = $this->ElementosSenializacione->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

            $this->set('obra_nombre', $obra_nombre);
            $this->set('elementosSenializaciones', $this->paginate('ElementosSenializacione', array('ElementosSenializacione.obra_id' => $obra_id)));
            $this->render('view_edit_elementos_senializacion');
        }
    }

    function __save_elementos_senializacion($obra_id = null, $data = null) {
        if (!empty($obra_id) && !empty($data)) {
            /** Chequeo si no existe en la db un elemento de señalización con los mismos datos:
             * menues_senializacione_id
             * obra_id
             */
            if (isset($this->data['ElementosSenializacione']['id']) && (!empty($this->data['ElementosSenializacione']['id']))) {
                $elemento = $this->ElementosSenializacione->find('all', array('conditions' => array('ElementosSenializacione.id <>' => $this->data['ElementosSenializacione']['id'], 'ElementosSenializacione.menues_senializacione_id' => $this->data['ElementosSenializacione']['menues_senializacione_id'], 'ElementosSenializacione.obra_id' => $this->data['ElementosSenializacione']['obra_id'])));
            } else {
                $elemento = $this->ElementosSenializacione->find('all', array('conditions' => array('ElementosSenializacione.menues_senializacione_id' => $this->data['ElementosSenializacione']['menues_senializacione_id'], 'ElementosSenializacione.obra_id' => $this->data['ElementosSenializacione']['obra_id'])));
            }

            if (empty($elemento)) {

                $this->ElementosSenializacione->create();
                if ($this->ElementosSenializacione->save($this->data)) {
                    if ($this->NivelServicio->save($obra_id)) {
                        $this->ElementosSenializacione->commit();
                        echo 'El elemento de señalización se guardó correctamente.';
                        exit;
                    } else {
                        $this->ElementosSenializacione->rollback();
                        echo 'El elemento de señalización no se ha podido guardar.';
                        exit;
                    }
                } else {
                    $this->ElementosSenializacione->rollback();
                    echo 'El elemento de señalización no se ha podido guardar.';
                    exit;
                }
            } else {
                $this->ElementosSenializacione->rollback();
                echo 'El elemento de señalización ya existe.';
                exit;
            }
        }
    }

    function edit_evaluacion_elementos_senializacion($evaluacione_id = null) {
        $this->__aux_edit_evaluacion_elementos_senializacion($evaluacione_id);
    }

    function admin_edit_evaluacion_elementos_senializacion($evaluacione_id = null) {
        $this->__aux_edit_evaluacion_elementos_senializacion($evaluacione_id);
    }

    /**
     * Permite editar la evaluación de un elemento de señalización de una obra de arte
     * @param <type> $evaluacione_id
     */
    function __aux_edit_evaluacion_elementos_senializacion($evaluacione_id = null) {
        $this->layout = false;

        if (!empty($this->data)) {
            $evaluacione_id = $this->data['Evaluacione']['evaluacione_id'];
        }

        // Verifico si la evaluación que se está queriendo editar es la última evaluación
        // cargada para la obra de arte, si es asi, modifico sin problemas,
        // de lo contrario, le muestro al usuario una vista informativa,
        // indicándole que no puede editar una evaluación vieja, porque
        // modificaría el estado actual del elemento de señalización, con un estado inconsistente

        if ($this->lastEvaluacion($evaluacione_id)) {

            $tipos = array('Horizontal' => 'Horizontal', 'Vertical' => 'Vertical');
            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre')));
            $obra_id = 0;

            if (empty($this->data)) {
                if (!empty($evaluacione_id)) {
                    $evaluacione = $this->Evaluacione->findById($evaluacione_id);

                    if (!empty($evaluacione)) {
                        $obra_id = $evaluacione['Evaluacione']['obra_id'];
                        $obra = $this->Obra->findById($obra_id);
                        $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;
                    }
                }
            } else {
                $this->__save_evaluacion_elementos_senializacion($this->data);
            }
            $referer = $this->referer();
            $this->set(compact('tipos', 'estados', 'obra_id', 'evaluacione_id', 'referer'));
            $this->render('edit_evaluacion_elementos_senializacion');
        } else {
            $mensaje = 'No es posible editar la evaluación de los elementos de señalización, porque la evaluación que está modificando no es la última evaluación cargada para la obra de arte. Modificar una evaluación vieja, provocaría un cambio en el estado actual de los elementos de señalización con un estado inconsistente.';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function listado_elementos_senializacion_edit_evals($evaluacione_id = null) {
        $this->__aux_listado_elementos_senializacion_edit_evals($evaluacione_id);
    }

    function admin_listado_elementos_senializacion_edit_evals($evaluacione_id = null) {
        $this->__aux_listado_elementos_senializacion_edit_evals($evaluacione_id);
    }

    /**
     * Lista todos los elementos de señalización de la obra para la cual se está registrando
     * la evaluación
     */
    function __aux_listado_elementos_senializacion_edit_evals($evaluacione_id = null) {
        $this->layout = false;

        if (!empty($evaluacione_id)) {
            $evaluacion = $this->Evaluacione->findById($evaluacione_id);

            $obra_nombre = '';
            $obra_id = 0;
            if (!empty($evaluacion)) {
                $obra_id = $evaluacion['Evaluacione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
            }
            $this->set('obra_nombre', $obra_nombre);
            $this->set('elementosSenializacionesEvals', $this->paginate('ElementosSenializacione', array('ElementosSenializacione.obra_id' => $obra_id)));
            $this->render('listado_elementos_senializacion_editar_evaluacion');
        }
    }

    function __save_evaluacion_elementos_senializacion($data = null) {
        if (!empty($data)) {
            if (!empty($data['Evaluacione']['evaluacione_id']) && !empty($data['ElementosSenializacione']['id'])) {

                // Verifico si ya existe una evaluación registrada para el elemento que estoy editando
                $evaluacion_registrada = $this->ElementosSenializacionesEval->find('all', array('conditions' => array('ElementosSenializacionesEval.evaluacione_id' => $data['Evaluacione']['evaluacione_id'], 'ElementosSenializacionesEval.elementos_senializacione_id' => $data['ElementosSenializacione']['id'])));

                // Busco en la db, la información actual del elemento de señalización
                $elemento = $this->ElementosSenializacione->findById($data['ElementosSenializacione']['id'], array('recursive' => 0));

                $this->ElementosSenializacione->begin();
                if (empty($evaluacion_registrada)) {
                    // Si no existe evaluación, guardo la información actual del elemento de señalización en el historial de evaluaciones (elementos_senializacions_evals)

                    $elementos_senializacion_eval = array();
                    if (!empty($elemento)) {
                        // Armo el array para hacer el save en el historial de evaluaciones (en el modelo "ElementosSenializacionesEval")
                        $elementos_senializacion_eval['ElementosSenializacionesEval'] = $elemento['ElementosSenializacione'];
                        $elementos_senializacion_eval['ElementosSenializacionesEval']['evaluacione_id'] = $data['Evaluacione']['evaluacione_id'];
                        if (!empty($elementos_senializacion_eval)) {
                            $elementos_senializacion_eval['ElementosSenializacionesEval']['elementos_senializacione_id'] = $elementos_senializacion_eval['ElementosSenializacionesEval']['id'];
                            unset($elementos_senializacion_eval['ElementosSenializacionesEval']['id']);
                            unset($elementos_senializacion_eval['ElementosSenializacionesEval']['obra_id']);

                            // Guardo en el historial de evaluaciones (en el modelo "ElementosSenializacionesEval")
                            $this->ElementosSenializacionesEval->create();
                            if (!$this->ElementosSenializacionesEval->save($elementos_senializacion_eval)) {
                                $this->ElementosSenializacione->rollback();
                                echo 'La evaluación del elemento de señalización no se ha podido guardar.';
                                exit;
                            }
                        }
                    }
                }
                if (!empty($elemento)) {
                    // Antes de modificar la información del elemento de señalización en el modelo
                    // "ElementosSenializacione", para registrar el resultado de la evaluación del elemento:
                    // Primero verifico que la descripción y/o el estado del elemento se hayan modificado,
                    // en caso contrario, no registro la evaluación del elemento

                    $descripcion_actual = $elemento['ElementosSenializacione']['descripcion'];
                    $estado_actual = $elemento['ElementosSenializacione']['estado_id'];

                    $descripcion_evaluacion = $data['ElementosSenializacione']['descripcion'];
                    $estado_evaluacion = $data['ElementosSenializacione']['estado_id'];

                    if (($descripcion_actual != $descripcion_evaluacion) || ($estado_actual != $estado_evaluacion)) {

                        $data['ElementosSenializacione']['fecha_actualizacion'] = date("Y-m-d H:i:s");
                        $elementos_senializacion['ElementosSenializacione'] = $data['ElementosSenializacione'];

                        if ($this->ElementosSenializacione->save($elementos_senializacion)) {
                            if ($this->NivelServicio->save($elemento['ElementosSenializacione']['obra_id'])) {
                                $this->ElementosSenializacione->commit();
                                echo 'La evaluación del elemento de señalización se guardó correctamente.';
                                exit;
                            } else {
                                $this->ElementosSenializacione->rollback();
                                echo 'La evaluación del elemento de señalización no se ha podido guardar.';
                                exit;
                            }
                        } else {
                            $this->ElementosSenializacione->rollback();
                            echo 'La evaluación del elemento de señalización no se ha podido guardar.';
                            exit;
                        }
                    } else {
                        $this->ElementosSenializacione->rollback();
                        echo 'La evaluación del elemento de señalización no se ha guardado, porque no se ha modificado la información actual del elemento.';
                        exit;
                    }
                } else {
                    $this->ElementosSenializacione->rollback();
                    echo 'La evaluación del elemento de señalización no se ha podido guardar.';
                    exit;
                }
            }
        }
    }

    function edit_intervencion_elementos_senializacion($intervencione_id = null) {
        $this->__aux_edit_intervencion_elementos_senializacion($intervencione_id);
    }

    function admin_edit_intervencion_elementos_senializacion($intervencione_id = null) {
        $this->__aux_edit_intervencion_elementos_senializacion($intervencione_id);
    }

    /**
     * Permite editar la intervención de un elemento de señalización de una obra de arte
     * @param <type> $intervencione_id
     */
    function __aux_edit_intervencion_elementos_senializacion($intervencione_id = null) {
        $this->layout = false;

        if (!empty($this->data)) {
            $intervencione_id = $this->data['Intervencione']['intervencione_id'];
        }

        // Verifico si la intervención que se está queriendo editar es la última intervención
        // cargada para la obra de arte, si es asi, modifico sin problemas,
        // de lo contrario, le muestro al usuario una vista informativa,
        // indicándole que no puede editar una intervención vieja, porque
        // modificaría el estado actual del elemento de señalización, con un estado inconsistente

        if ($this->lastIntervencion($intervencione_id)) {

            $tipos = array('Horizontal' => 'Horizontal', 'Vertical' => 'Vertical');
            $estados = $this->Estado->find('list', array('fields' => array('Estado.id', 'Estado.nombre')));
            $obra_id = 0;

            if (empty($this->data)) {
                if (!empty($intervencione_id)) {
                    $intervencione = $this->Intervencione->findById($intervencione_id);

                    if (!empty($intervencione)) {
                        $obra_id = $intervencione['Intervencione']['obra_id'];
                        $obra = $this->Obra->findById($obra_id);
                        $obras_tipo_id = (!empty($obra)) ? $obra['Obra']['obras_tipo_id'] : 0;
                    }
                }
            } else {
                $this->__save_intervencion_elementos_senializacion($this->data);
            }
            $referer = $this->referer();
            $this->set(compact('tipos', 'estados', 'obra_id', 'intervencione_id', 'referer'));
            $this->render('edit_intervencion_elementos_senializacion');
        } else {
            $mensaje = 'No es posible editar la intervención de los elementos de señalización, porque la intervención que está modificando no es la última intervención cargada para la obra de arte. Modificar una intervención vieja, provocaría un cambio en el estado actual de los elementos de señalización con un estado inconsistente.';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function listado_elementos_senializacion_edit_inters($intervencione_id = null) {
        $this->__aux_listado_elementos_senializacion_edit_inters($intervencione_id);
    }

    function admin_listado_elementos_senializacion_edit_inters($intervencione_id = null) {
        $this->__aux_listado_elementos_senializacion_edit_inters($intervencione_id);
    }

    /**
     * Lista todos los elementos de señalización de la obra para la cual se está registrando
     * la intervención
     */
    function __aux_listado_elementos_senializacion_edit_inters($intervencione_id = null) {
        $this->layout = false;

        if (!empty($intervencione_id)) {
            $intervencion = $this->Intervencione->findById($intervencione_id);

            $obra_nombre = '';
            $obra_id = 0;
            if (!empty($intervencion)) {
                $obra_id = $intervencion['Intervencione']['obra_id'];
                $obra = $this->Obra->findById($obra_id);
                $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';
            }
            $this->set('obra_nombre', $obra_nombre);
            $this->set('elementosSenializacionesInters', $this->paginate('ElementosSenializacione', array('ElementosSenializacione.obra_id' => $obra_id)));
            $this->render('listado_elementos_senializacion_editar_intervencion');
        }
    }

    function __save_intervencion_elementos_senializacion($data = null) {
        if (!empty($data)) {
            if (!empty($data['Intervencione']['intervencione_id']) && !empty($data['ElementosSenializacione']['id'])) {

                // Verifico si ya existe una intervención registrada para el elemento que estoy editando
                $intervencion_registrada = $this->ElementosSenializacionesInter->find('all', array('conditions' => array('ElementosSenializacionesInter.intervencione_id' => $data['Intervencione']['intervencione_id'], 'ElementosSenializacionesInter.elementos_senializacione_id' => $data['ElementosSenializacione']['id'])));

                // Busco en la db, la información actual del elemento de señalización
                $elemento = $this->ElementosSenializacione->findById($data['ElementosSenializacione']['id'], array('recursive' => 0));

                $this->ElementosSenializacione->begin();
                if (empty($intervencion_registrada)) {
                    // Si no existe intervención, guardo la información actual del elemento de señalización en el historial de intervenciones (elementos_senializacions_inters)

                    $elementos_senializacion_inter = array();
                    if (!empty($elemento)) {
                        // Armo el array para hacer el save en el historial de intervenciones (en el modelo "ElementosSenializacionesInter")
                        $elementos_senializacion_inter['ElementosSenializacionesInter'] = $elemento['ElementosSenializacione'];
                        $elementos_senializacion_inter['ElementosSenializacionesInter']['intervencione_id'] = $data['Intervencione']['intervencione_id'];
                        if (!empty($elementos_senializacion_inter)) {
                            $elementos_senializacion_inter['ElementosSenializacionesInter']['elementos_senializacione_id'] = $elementos_senializacion_inter['ElementosSenializacionesInter']['id'];
                            unset($elementos_senializacion_inter['ElementosSenializacionesInter']['id']);
                            unset($elementos_senializacion_inter['ElementosSenializacionesInter']['obra_id']);

                            // Guardo en el historial de intervenciones (en el modelo "ElementosSenializacionesInter")
                            $this->ElementosSenializacionesInter->create();
                            if (!$this->ElementosSenializacionesInter->save($elementos_senializacion_inter)) {
                                $this->ElementosSenializacione->rollback();
                                echo 'La intervención del elemento de señalización no se ha podido guardar.';
                                exit;
                            }
                        }
                    }
                }
                if (!empty($elemento)) {
                    // Antes de modificar la información del elemento de señalización en el modelo
                    // "ElementosSenializacione", para registrar el resultado de la intervención del elemento:
                    // Primero verifico que la descripción y/o el estado del elemento se hayan modificado,
                    // en caso contrario, no registro la intervención del elemento

                    $descripcion_actual = $elemento['ElementosSenializacione']['descripcion'];
                    $estado_actual = $elemento['ElementosSenializacione']['estado_id'];

                    $descripcion_intervencion = $data['ElementosSenializacione']['descripcion'];
                    $estado_intervencion = $data['ElementosSenializacione']['estado_id'];

                    if (($descripcion_actual != $descripcion_intervencion) || ($estado_actual != $estado_intervencion)) {

                        $data['ElementosSenializacione']['fecha_actualizacion'] = date("Y-m-d H:i:s");
                        $elementos_senializacion['ElementosSenializacione'] = $data['ElementosSenializacione'];

                        if ($this->ElementosSenializacione->save($elementos_senializacion)) {
                            if ($this->NivelServicio->save($elemento['ElementosSenializacione']['obra_id'])) {
                                $this->ElementosSenializacione->commit();
                                echo 'La intervención del elemento de señalización se guardó correctamente.';
                                exit;
                            } else {
                                $this->ElementosSenializacione->rollback();
                                echo 'La intervención del elemento de señalización no se ha podido guardar.';
                                exit;
                            }
                        } else {
                            $this->ElementosSenializacione->rollback();
                            echo 'La intervención del elemento de señalización no se ha podido guardar.';
                            exit;
                        }
                    } else {
                        $this->ElementosSenializacione->rollback();
                        echo 'La intervención del elemento de señalización no se ha guardado, porque no se ha modificado la información actual del elemento.';
                        exit;
                    }
                } else {
                    $this->ElementosSenializacione->rollback();
                    echo 'La intervención del elemento de señalización no se ha podido guardar.';
                    exit;
                }
            }
        }
    }


}
?>